﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using UniMana.Data;
using UniMana.Utils.Data;
using DevExpress.XtraBars;
using UniMana.Utils.Configs;
using UniMana.Utils.LoginInfo;
using DevExpress.XtraTab;
using DevExpress.XtraGrid.Views.BandedGrid;
using DevExpress.XtraEditors;
using DevExpress.XtraGrid.Views.Grid;
using System.Drawing;
using UniMana.Utils.Controls;
using UniMana.Utils.Helper;
using DevExpress.Utils;

namespace UniMana.Win.Personnel
{
    public partial class FrmAttendance : DevExpress.XtraEditors.XtraForm
    {

        public DataTable tblIdleList = new DataTable();
        private DBMain m_data = new DBMain();
        private bds m_bsdListSymbol = new bds(); //BindingSouce cho danh sách 

        private bds m_Synthesis = new bds();

        private Color sundayColor = System.Drawing.Color.LightGreen;

        private string month = string.Empty;
        private string year = string.Empty;
        private string dept = string.Empty;
        private List<int?> iDptAllowList = new List<int?>(); //Danh sách phòng/ban mà user được phép chấm công
        private List<int?> iDepartmentList = new List<int?>();

        private string m_Rule = UniMana.Utils.Configs.RuleConfig.ATTENDANCE;
        List<string> listSymbol = new List<string>(); //Lưu các ký tự chấm công được dùng
        Dictionary<int, string> dictSymbol = new Dictionary<int, string>();

        public FrmAttendance()
        {
            if (!SysUtils.CheckAccessByRule(m_Rule))
            {
                return;

            }
            InitializeComponent();

            rluCatalogue_Department.GetData(m_data.m_DCReadOnly.Catalogue_Departments);
            rluCatalogue_Degree.GetData(m_data.m_DCReadOnly.Catalogue_Degrees);

            //Danh sách các phòng ban mà user này được quyền chấm công
            iDptAllowList = this.GetListDeptRole(SysGlobalVar.g_sta_sysUserLogin.Properties.Personnel_PersonnelKey.ToString());
            this.LoadData();

            //Khởi tại danh sách các ký tự được dùng
            var q = m_data.m_DCReadOnly.Catalogue_Idles.Where(p => p.V2 == true).OrderBy(p => p.ID);
            foreach (var i in q)
            {
                listSymbol.Add(i.ID);
                dictSymbol.Add(i.Catalogue_IdleKey, i.ID);
            }

            #region [Dùng riêng cho hữu \@@/]
            if (/*SysGlobalVar.g_sta_sysUserLogin.Properties.UserName == "nguyen.huu"
                ||*/ SysGlobalVar.g_sta_sysUserLogin.Properties.UserName == "tran.thao")
            {
                gctAttendance.ContextMenuStrip = contextMenuStrip1;
                bbiAddPrs.Visibility = BarItemVisibility.Always;
            }
            else
            {
                gctAttendance.ContextMenuStrip = null;
                bbiAddPrs.Visibility = BarItemVisibility.Never;
                gctAttendance.ContextMenuStrip = contextMenuStrip2;
            }
            xtraTabPage1.PageVisible = false;
            xtpByDept.PageVisible = false;
            #endregion

            gctAttendance_Synthesis.DataSource = m_Synthesis;

        }

        private void FrmAttendance_Load(object sender, EventArgs e)
        {
            DateTime d = m_data.m_DCSave.GetSystemDate();
            if (d.Day <= 25)
            {
                cmbMonth.SelectedIndex = d.Month - 1;
            }
            else
            {
                cmbMonth.SelectedIndex = d.Month == 12 ? 1 : d.Month;
            }
            cmbMonth.SelectedIndex = d.Month - 1;
            cmbYear.SelectedIndex = d.Year - 2012;
            m_bsdListSymbol.DataSource = m_data.m_DCReadOnly.Catalogue_Idles.Where(p => p.V2 == true).OrderBy(p => p.ID);
            gctSymbol.DataSource = m_bsdListSymbol;
            rluInsuranceType.GetData(m_data.m_DCReadOnly.Catalogue_InsuranceTypes);
            rluInsuranceType.NullText = "Chưa xác định";

            lueCatalogue_Department_EditValueChanged(sender, e);
            //Kiểm tra khi nào thi khóa bảng chấm công
            //this.CheckForLockAttendanceGrid();
        }

        #region [Utils]

        public void LoadData()
        {
            rluCatalogue_Shifts.GetData(m_data.m_DCReadOnly.Catalogue_Shifts);

            var q = from dpt in m_data.m_DCReadOnly.Catalogue_Departments
                    where GblLoginInfo.iListDepartment.Contains(dpt.Catalogue_DepartmentKey)
                    select dpt;
            lueCatalogue_Department.GetData(q, nullText: "---Chọn tất cả---");
            foreach (var q1 in q)
            {
                iDepartmentList.Add(q1.Catalogue_DepartmentKey);
            }
            if (q.Count() == 1)
            {
                lueCatalogue_Department.EditValue = q.FirstOrDefault().Catalogue_DepartmentKey;
            }

            #region []
            //var deptList = from dept in m_data.m_DCReadOnly.Catalogue_Departments
            //               where iDptAllowList.Contains(dept.Catalogue_DepartmentKey)
            //               select dept;
            //if (deptList.Count() > 0)
            //{
            //    lueCatalogue_Department.GetData(deptList);
            //}
            //else
            //{
            //    try
            //    {
            //        lueCatalogue_Department.GetData(m_data.m_DCReadOnly.Catalogue_Departments.Where(
            //            p => p.Catalogue_DepartmentKey == GblLoginInfo.iDepartmentKey));
            //        lueCatalogue_Department.EditValue = GblLoginInfo.iDepartmentKey;
            //        lueCatalogue_Department.Enabled = false;
            //    }
            //    catch { };
            //}
            #endregion[]
        }

        //1. Khởi tạo bảng chấm công
        public void InitDataTable()
        {

            tblIdleList.Columns.Clear();
            DataColumn tcl0 = new DataColumn("Personnel_PersonnelKey");
            DataColumn tcl1 = new DataColumn("ID");
            DataColumn tcl2 = new DataColumn("LastName");
            DataColumn tcl3 = new DataColumn("Name");
            DataColumn tcl4 = new DataColumn("Catalogue_DepartmentKey");
            DataColumn tcl5 = new DataColumn("Catalogue_ShiftsKey");
            tblIdleList.Columns.AddRange(new DataColumn[] { tcl0, tcl1, tcl2, tcl3, tcl4, tcl5 });

            for (int i = 26; i <= 31; i++)
            {
                DataColumn tcl = new DataColumn("D" + i);
                tblIdleList.Columns.Add(tcl);
            }
            for (int i = 1; i <= 25; i++)
            {
                DataColumn tcl = new DataColumn("D" + i);
                tblIdleList.Columns.Add(tcl);
            }

            DataColumn tcl13 = new DataColumn("AbsentDay");
            DataColumn tcl14 = new DataColumn("WorkDay");
            DataColumn tcl15 = new DataColumn("ContactWorkDays");
            DataColumn tcl16 = new DataColumn("AllowDay");
            DataColumn tcl17 = new DataColumn("NotAllowDay");
            DataColumn tcl18 = new DataColumn("TotalWorkDay");
            DataColumn tcl19 = new DataColumn("TotalAbsentDay");
            DataColumn tcl20 = new DataColumn("NameID");

            tblIdleList.Columns.AddRange(new DataColumn[] { tcl13, tcl14, tcl15, tcl16, tcl17, tcl18, tcl19, tcl20 });

        }

        //2. Tạo mới bảng (Table) chấm công
        public void MakeNewAttendanceTable()
        {
            tblIdleList.Rows.Clear();

            this.InitDataTable(); //Tạo lại bảng

            int deptKey = lueCatalogue_Department.GetIntValue();
            var q = from prs in m_data.m_DCReadOnly.Personnel_Personnels
                    join cwd in m_data.m_DCReadOnly.Personnel_ContactWorkDays on prs.Personnel_PersonnelKey equals cwd.Personnel_PersonnelKey
                    where prs.Catalogue_DepartmentKey == deptKey
                    where prs.Catalogue_PersonnelStatusKey == 1
                    where prs.Personnel_PersonnelTypeKey != 2
                    select new
                    {
                        prs.Personnel_PersonnelKey,
                        prs.ID,
                        prs.LastName,
                        prs.Name,
                        prs.Catalogue_DepartmentKey,
                        WorkDay = 0.0,
                        AbsentDay = 0.0,
                        cwd.ContactWorkDays,
                        AllowDay = .00,
                        NotAllowDay = 0.0,
                        TotalWorkDay = 0.0,
                        NameID = "[" + prs.ID + "] " + prs.LastName + " " + prs.Name
                    };
            var shifts = from sh in m_data.m_DCReadOnly.Catalogue_Shifts select sh;


            foreach (var item in q)
            {
                foreach (var shift in shifts)
                {
                    DataRow r = tblIdleList.NewRow();
                    r["Personnel_PersonnelKey"] = item.Personnel_PersonnelKey;
                    r["Catalogue_ShiftsKey"] = shift.Catalogue_ShiftsKey;
                    r["ID"] = item.ID;
                    r["LastName"] = item.LastName;
                    r["Name"] = item.Name;
                    r["Catalogue_DepartmentKey"] = item.Catalogue_DepartmentKey;
                    r["WorkDay"] = item.WorkDay;
                    r["AbsentDay"] = item.AbsentDay;
                    r["ContactWorkDays"] = item.ContactWorkDays;
                    r["AllowDay"] = item.AllowDay;
                    r["NotAllowDay"] = item.NotAllowDay;
                    r["TotalWorkDay"] = item.TotalWorkDay;
                    r["NameID"] = item.NameID;
                    tblIdleList.Rows.Add(r);
                }
            }
            gctAttendance.DataSource = tblIdleList;
            grvAttendance.BestFitColumns();
        }

        //3. Khởi tạo lưới (bỏ các ngày ko hợp lệ, đánh dấu ngày chủ nhật
        public void SetUpGrid()
        {
            #region [Kiểm tra ẩn cột trong lưới]
            int Month = int.Parse(this.month);
            int Year = int.Parse(this.year);
            int days = DateTime.DaysInMonth(Year, Month - 1 > 0 ? Month - 1 : 12);
            foreach (BandedGridColumn cl in grvAttendance.Columns)
            {
                if (cl.FieldName.Substring(0, 1) == "D" && cl.OptionsColumn.AllowEdit == true)
                {
                    try
                    {
                        //Ẩn cột ngày không hợp lệ
                        int dayNum = int.Parse(cl.FieldName.Substring(1));
                        if (dayNum > days)
                        {
                            cl.Visible = false;
                        }
                        else
                        {
                            cl.Visible = true;
                        }

                        //Tô màu ngày chủ nhật
                        string dayOfWeek = string.Empty;
                        if (dayNum > 25) //tháng trước
                        {
                            dayOfWeek = new DateTime(Month - 1 > 0 ? Year : Year - 1, Month - 1 > 0 ? Month - 1 : 12, dayNum).DayOfWeek.ToString();
                        }
                        else //tháng hiện tại
                        {
                            dayOfWeek = new DateTime(Year, Month, dayNum).DayOfWeek.ToString();
                        }


                        if (dayOfWeek == "Sunday")
                        {
                            cl.AppearanceCell.BackColor = sundayColor;
                        }
                        else
                        {
                            cl.AppearanceCell.BackColor = System.Drawing.Color.Transparent;
                        }
                        //Đổi caption của cột
                        cl.Caption = dayNum + "\n" + dayOfWeek.Substring(0, 3);
                    }
                    catch { }
                }
            }
            #endregion
        }

        //4. Kiểm tra nếu bảng chấm công chưa tồn tại thì tạo mới
        private void CreateAttendance()
        {

            if (cmbYear.SelectedIndex >= 0 && cmbMonth.SelectedIndex >= 0 && lueCatalogue_Department.GetIntValue() != -1)
            {
                int year = int.Parse(cmbYear.Text);
                int month = int.Parse(cmbMonth.Text);
                int deptKey = lueCatalogue_Department.GetIntValue();
                //Kiểm tra xem bảng lương này có tồn tại chưa
                var check = m_data.m_DCReadOnly.Personnel_AttendanceV2s.Where(p => p.Year == year && p.Month == month && p.Catalogue_DepartmentKey == deptKey);

                if (check.Count() > 0)
                {
                    grvAttendance.Columns.Clear();
                    tblIdleList.Rows.Clear();
                    MsgConfig.ShowErrorDialog("Bảng chấm công này đã tồn tại, vui lòng kiểm tra lại thông tin");
                    return;
                }
                //Nếu chưa tồn tại thì tạo mới
                //this.InitSchedulerGrid(year, month);
                this.MakeNewAttendanceTable();
            }
            else
            {
                MsgConfig.ShowErrorDialog("Vui lòng chọn đầy đủ thông tin (phòng/ban năm, tháng đầy đủ) trước khi tạo chấm công");
            }
        }

        //5. Kiểm tra khi nào thì khóa bảng chấm công
        public void CheckForLockAttendanceGrid()
        {

            #region [Kiểm tra quyền]
            if (!SysUtils.CheckEditByRule(this.m_Rule, false))
            {
                btnUnclock.Enabled = false;
            }

            if (!SysUtils.CheckSaveByRule(this.m_Rule, false))
            {
                grvAttendance.OptionsBehavior.Editable = false;
                return;
            }
            else
            {
                try
                {
                    Personnel_AttendanceV2Info info = new Personnel_AttendanceV2Info(int.Parse(this.year), int.Parse(this.month), lueCatalogue_Department.GetIntValue());
                    if (info.Properties.IsClocked == true)
                    {
                        grvAttendance.OptionsBehavior.Editable = false;
                        btnClock.Enabled = false;
                        btnUnclock.Enabled = true;
                    }
                    else
                    {
                        grvAttendance.OptionsBehavior.Editable = true;
                        btnClock.Enabled = true;
                        btnUnclock.Enabled = false;
                    }
                }
                catch { }
            }
            #endregion

            if (lueCatalogue_Department.EditValue == null)
            {
                grvAttendance.OptionsBehavior.Editable = false;
            }
            else
            {
                grvAttendance.OptionsBehavior.Editable = true;
            }

            #region [Khóa các cột mà user không có quyền chấm]
            //Khóa các cột
            DBMain data = new DBMain();
            DateTime d = data.m_DCSave.GetSystemDate();
            int today = d.Day;

            if (iDptAllowList.Count == 0)
            {
                foreach (BandedGridColumn cl in grvAttendance.Columns)
                {
                    if (cl.Name.Contains("NET")) { continue; }
                    else
                    {
                        int i = 0;
                        if (cl.FieldName.Contains("D") && !cl.Name.Contains("NET"))
                        {
                            i = int.Parse(cl.FieldName.Substring(1));

                            if ((today > 25 && today > i) || (today >= 1 && today <= 25 && i < today))
                            {

                                cl.OptionsColumn.AllowEdit = false;
                            }
                            else
                            {
                                cl.OptionsColumn.AllowEdit = true;
                            }
                        }
                    }
                }
            }//End
            else
            {
                grvAttendance.OptionsBehavior.Editable = iDptAllowList.Contains(lueCatalogue_Department.GetIntValue());
            }
            #endregion


        }

        //6. Lấy danh sách phòng ban mà người dùng được phép thao tác
        public List<int?> GetListDeptRole(string userKey)
        {
            List<int?> result = new List<int?>();
            var q = m_data.m_DCReadOnly.Personnel_AttendanceDevisions.Where(p => p.Personnel_PersonnelKey == Guid.Parse(userKey));
            foreach (var item in q)
            {
                result.Add(item.Catalogue_DepartmentKey);
            }
            return result;
        }

        #endregion

        #region [Sự kiện các edit control thay đổi giá trị]

        //1. Combox năm thay đổi
        private void cmbYear_SelectedIndexChanged(object sender, EventArgs e)
        {
            bsiYear.Caption = "Bảng chấm công " + cmbYear.Text;
            this.year = cmbYear.Text;
        }

        //2. Combox tháng thay đổi
        private void cmbMonth_SelectedIndexChanged(object sender, EventArgs e)
        {
            bsiMonth.Caption = cmbMonth.Text;
            this.month = cmbMonth.Text;
        }

        //3. Khoa thay đổi
        private void lueCatalogue_Department_EditValueChanged(object sender, EventArgs e)
        {
            this.dept = lueCatalogue_Department.Text;
            if (lueCatalogue_Department.GetIntValue() == -1)
            {
                btnSave.Enabled = false;
            }
            else
            {
                btnSave.Enabled = true;
            }
        }

        //4. Ô TRÊN LƯỚI ĐỔI GIÁ TRỊ
        private void grvAttendance_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
        {
            //////if (!SysUtils.CheckSaveByRule(this.m_Rule))
            //////{
            //////    return;
            //////}

            if (e.Column.Name.Contains("NET")) return; //Cột ko cần xử lý
            bool isExist = false;

            DevExpress.XtraGrid.Columns.GridColumn cl = e.Column;
            string val = e.Value.ToString();

            float contactWorkDays = float.Parse(grvAttendance.GetRowCellValue(e.RowHandle, grvAttendance.Columns["ContactWorkDays"]).ToString());

            #region [Tính tổng ngày công, ngày phép theo ca]
            var q = dictSymbol.Where(p => p.Value.ToUpper() == val.ToUpper());
            if (q.Count() > 0 || val == "")
            {
                isExist = true;
                double? numWorkDays = 0.0;
                double? numUnWorkDays = 0.0;

                //Duyệt qua từng dòng đếm số ngày phép, số ngày không phép
                for (int j = 0; j < grvAttendance.Columns.Count; j++)
                {
                    if (grvAttendance.Columns[j].Name.Contains("NET")) //Không phải là cột chấm công
                    {
                        continue;
                    }
                    else
                    {
                        Catalogue_Idle q1 = m_data.m_DCReadOnly.Catalogue_Idles.Where(p => p.ID.ToUpper() ==
                                                                                        grvAttendance.GetRowCellValue(e.RowHandle, grvAttendance.Columns[j]).ToString().ToUpper()
                                                                                        && p.V2 == true).FirstOrDefault();
                        if (q1 != null)
                        {
                            numWorkDays += q1.WorDaysPlus != null ? q1.WorDaysPlus : 0;
                            numUnWorkDays += q1.UnWorDaysPlus != null ? q1.UnWorDaysPlus : 0;
                        }
                    }
                }
                grvAttendance.SetRowCellValue(e.RowHandle, "WorkDay", numWorkDays);
                grvAttendance.SetRowCellValue(e.RowHandle, "AbsentDay", numUnWorkDays);
            }
            #endregion

            #region [Tính tổng ngày công theo tháng]
            if (isExist)
            {
                int shiftCount = 0;
                double totalWorkDays = 0.0; //Tổng ngày công (cộng 3 ca)
                double totalAbsentDays = 0.0;
                foreach (DataRow r in tblIdleList.Rows)
                {
                    if (r["Personnel_PersonnelKey"].ToString() == grvAttendance.GetRowCellValue(e.RowHandle, "Personnel_PersonnelKey").ToString())
                    {
                        shiftCount++;
                        totalWorkDays += double.Parse(r["WorkDay"].ToString());
                        totalAbsentDays += double.Parse(r["AbsentDay"].ToString());
                    }
                }

                shiftCount = 0;
                foreach (DataRow r in tblIdleList.Rows)
                {
                    if (r["Personnel_PersonnelKey"].ToString() == grvAttendance.GetRowCellValue(e.RowHandle, "Personnel_PersonnelKey").ToString())
                    {
                        shiftCount++;
                        r["TotalWorkDay"] = totalWorkDays;
                        r["TotalAbsentDay"] = totalAbsentDays;

                    }
                }
            }
            #endregion

            //Lưu bảng chấm công
            //this.Save_Attendace(); 


            //Nếu có chọn in đơn nghỉ phép
            if (ckePrintAttendanceReport.Checked)
            {
                Guid currentKey = Guid.Parse(grvAttendance.GetRowCellValue(e.RowHandle, "Personnel_PersonnelKey").ToString());
                Guid loginUserKey = Guid.Parse(SysGlobalVar.g_sta_sysUserLogin.Properties.Personnel_PersonnelKey.ToString());
                string day = e.Column.FieldName.Substring(1);
                this.PrintAbsentForm(currentKey, loginUserKey, e.Value.ToString(), day);
            }


            //Nếu biểu tượng chấm công không có thì trở lại
            if (isExist == false && val != "")
            {
                MsgConfig.ShowErrorDialog("Ký hiệu chấm công không hợp lệ!");
                grvAttendance.SetRowCellValue(e.RowHandle, cl, "");
            }
        }
        #endregion

        #region [Database Events]

        //1. Lưu bảng chấm công
        private void Save_Attendace()
        {
            //try
            //{
            this.Validate();

            //Lưu bảng chấm công
            int year = int.Parse(cmbYear.Text);
            int month = int.Parse(cmbMonth.Text);
            Personnel_AttendanceV2Info attInfo = new Personnel_AttendanceV2Info(year, month, lueCatalogue_Department.GetIntValue());
            attInfo.Save();

            //Lưu chi tiết bảng chấm công
            DataTable tblTemp = gctAttendance.DataSource as DataTable;


            Dictionary<string, string> dictTotalSaved = new Dictionary<string, string>(); //Lưu danh sách nhân viên đã lưu tổng ngày công
            foreach (DataRow r in tblTemp.Rows)
            {
                int attKey = attInfo.Properties.Personnel_AttendanceKey;
                string persKey = r["Personnel_PersonnelKey"].ToString();
                int shiftKey = int.Parse(r["Catalogue_ShiftsKey"].ToString());
                Personnel_AttendanceDetailV2Info attDetailInfo = new Personnel_AttendanceDetailV2Info(attKey, persKey, shiftKey);

                #region [31 ngày công]

                attDetailInfo.Properties.D26 = dictSymbol.Where(p => p.Value.ToUpper() == r["D26"].ToString().ToUpper()).FirstOrDefault().Key;
                attDetailInfo.Properties.D27 = dictSymbol.Where(p => p.Value.ToUpper() == r["D27"].ToString().ToUpper()).FirstOrDefault().Key;
                attDetailInfo.Properties.D28 = dictSymbol.Where(p => p.Value.ToUpper() == r["D28"].ToString().ToUpper()).FirstOrDefault().Key;

                try
                {
                    attDetailInfo.Properties.D29 = dictSymbol.Where(p => p.Value.ToUpper() == r["D29"].ToString().ToUpper()).FirstOrDefault().Key;
                }
                catch { }

                try
                {
                    attDetailInfo.Properties.D30 = dictSymbol.Where(p => p.Value.ToUpper() == r["D30"].ToString().ToUpper()).FirstOrDefault().Key;
                }
                catch { }

                try
                {
                    attDetailInfo.Properties.D31 = dictSymbol.Where(p => p.Value.ToUpper() == r["D31"].ToString().ToUpper()).FirstOrDefault().Key;
                }
                catch { }

                attDetailInfo.Properties.D1 = dictSymbol.Where(p => p.Value.ToUpper() == r["D1"].ToString().ToUpper()).FirstOrDefault().Key;
                attDetailInfo.Properties.D2 = dictSymbol.Where(p => p.Value.ToUpper() == r["D2"].ToString().ToUpper()).FirstOrDefault().Key;
                attDetailInfo.Properties.D3 = dictSymbol.Where(p => p.Value.ToUpper() == r["D3"].ToString().ToUpper()).FirstOrDefault().Key;
                attDetailInfo.Properties.D4 = dictSymbol.Where(p => p.Value.ToUpper() == r["D4"].ToString().ToUpper()).FirstOrDefault().Key;
                attDetailInfo.Properties.D5 = dictSymbol.Where(p => p.Value.ToUpper() == r["D5"].ToString().ToUpper()).FirstOrDefault().Key;
                attDetailInfo.Properties.D6 = dictSymbol.Where(p => p.Value.ToUpper() == r["D6"].ToString().ToUpper()).FirstOrDefault().Key;
                attDetailInfo.Properties.D7 = dictSymbol.Where(p => p.Value.ToUpper() == r["D7"].ToString().ToUpper()).FirstOrDefault().Key;
                attDetailInfo.Properties.D8 = dictSymbol.Where(p => p.Value.ToUpper() == r["D8"].ToString().ToUpper()).FirstOrDefault().Key;
                attDetailInfo.Properties.D9 = dictSymbol.Where(p => p.Value.ToUpper() == r["D9"].ToString().ToUpper()).FirstOrDefault().Key;
                attDetailInfo.Properties.D10 = dictSymbol.Where(p => p.Value.ToUpper() == r["D10"].ToString().ToUpper()).FirstOrDefault().Key;
                attDetailInfo.Properties.D11 = dictSymbol.Where(p => p.Value.ToUpper() == r["D11"].ToString().ToUpper()).FirstOrDefault().Key;
                attDetailInfo.Properties.D12 = dictSymbol.Where(p => p.Value.ToUpper() == r["D12"].ToString().ToUpper()).FirstOrDefault().Key;
                attDetailInfo.Properties.D13 = dictSymbol.Where(p => p.Value.ToUpper() == r["D13"].ToString().ToUpper()).FirstOrDefault().Key;
                attDetailInfo.Properties.D14 = dictSymbol.Where(p => p.Value.ToUpper() == r["D14"].ToString().ToUpper()).FirstOrDefault().Key;
                attDetailInfo.Properties.D15 = dictSymbol.Where(p => p.Value.ToUpper() == r["D15"].ToString().ToUpper()).FirstOrDefault().Key;
                attDetailInfo.Properties.D16 = dictSymbol.Where(p => p.Value.ToUpper() == r["D16"].ToString().ToUpper()).FirstOrDefault().Key;
                attDetailInfo.Properties.D17 = dictSymbol.Where(p => p.Value.ToUpper() == r["D17"].ToString().ToUpper()).FirstOrDefault().Key;
                attDetailInfo.Properties.D18 = dictSymbol.Where(p => p.Value.ToUpper() == r["D18"].ToString().ToUpper()).FirstOrDefault().Key;
                attDetailInfo.Properties.D19 = dictSymbol.Where(p => p.Value.ToUpper() == r["D19"].ToString().ToUpper()).FirstOrDefault().Key;
                attDetailInfo.Properties.D20 = dictSymbol.Where(p => p.Value.ToUpper() == r["D20"].ToString().ToUpper()).FirstOrDefault().Key;
                attDetailInfo.Properties.D21 = dictSymbol.Where(p => p.Value.ToUpper() == r["D21"].ToString().ToUpper()).FirstOrDefault().Key;
                attDetailInfo.Properties.D22 = dictSymbol.Where(p => p.Value.ToUpper() == r["D22"].ToString().ToUpper()).FirstOrDefault().Key;
                attDetailInfo.Properties.D23 = dictSymbol.Where(p => p.Value.ToUpper() == r["D23"].ToString().ToUpper()).FirstOrDefault().Key;
                attDetailInfo.Properties.D24 = dictSymbol.Where(p => p.Value.ToUpper() == r["D24"].ToString().ToUpper()).FirstOrDefault().Key;
                attDetailInfo.Properties.D25 = dictSymbol.Where(p => p.Value.ToUpper() == r["D25"].ToString().ToUpper()).FirstOrDefault().Key;

                try
                {
                    attDetailInfo.Properties.AbsentDay = float.Parse(r["AbsentDay"].ToString());
                }
                catch { attDetailInfo.Properties.AbsentDay = 0; }


                try
                {
                    attDetailInfo.Properties.WorkDay = float.Parse(r["WorkDay"].ToString());
                }
                catch { attDetailInfo.Properties.WorkDay = 0; }


                try
                {
                    attDetailInfo.Properties.AllowDay = float.Parse(r["AllowDay"].ToString());
                }
                catch { attDetailInfo.Properties.AllowDay = 0; }


                try
                {
                    attDetailInfo.Properties.NotAllowDay = float.Parse(r["NotAllowDay"].ToString());
                }
                catch { attDetailInfo.Properties.NotAllowDay = 0; }


                #endregion
                attDetailInfo.Save();

                //Lưu tổng số ngày làm việc
                Personnel_TotalWorkDayInfo attTotalWork = new Personnel_TotalWorkDayInfo(attKey, persKey);
                if (dictTotalSaved.Where(p => p.Key == persKey).Count() == 0)
                {
                    attTotalWork.Properties.TotalWorkDay = float.Parse(r["TotalWorkDay"].ToString());
                    try
                    {
                        attTotalWork.Properties.TotalAbsentDay = float.Parse(r["TotalAbsentDay"].ToString());
                    }
                    catch /*(Exception ex)*/{ /*MessageBox.Show("Lỗi khi lưu. Vui lòng thử lại. " + "\n Mã lỗi:" + ex.Message);*/ attTotalWork.Properties.TotalAbsentDay = 0.0; }
                    dictTotalSaved.Add(persKey, persKey); //Add và danh sách đã lưu, không lưu nữa
                    attTotalWork.Save();
                }
            }
            //}
            //catch (Exception ex) { MessageBox.Show("Lỗi, mã lỗi : \n" + ex.Message); }
        }

        private void btnPrint_Click(object sender, ItemClickEventArgs e)
        {
            DataTable tblTemp = gctAttendance.DataSource as DataTable;
            new FrmAttendance_RptMonth(tblTemp, this.month, this.year, this.dept).ShowPreview();
        }

        //Nút khóa bảng chấm công
        private void btnClock_Unclock_Click(object sender, EventArgs e)
        {
            Personnel_AttendanceInfo info = new Personnel_AttendanceInfo(int.Parse(year), int.Parse(month), lueCatalogue_Department.GetIntValue());
            if (info.Properties.Personnel_AttendanceKey != null)
            {
                info.Properties.IsClocked = true;
                info.Save();
                grvAttendance.OptionsBehavior.Editable = false;
                btnClock.Enabled = false;
                btnUnclock.Enabled = true;
            }
        }

        private void btnView_Click(object sender, EventArgs e)
        {
            this.SetUpGrid();
            int year = int.Parse(cmbYear.Text);
            int month = int.Parse(cmbMonth.Text);
            #region [Bảng chấm công chi tiết]
            if (ckeDetail.Checked) //Bảng chấm công theo đơn vị
            {
                int deptKey = lueCatalogue_Department.GetIntValue();

                if (iDptAllowList.Count > 0)
                {
                    if (lueCatalogue_Department.EditValue == null)
                    {
                        tblIdleList = Personnel_AttendanceV2Data.GetPersonelMultiAttendance(m_data, year, month, iDepartmentList);
                    }
                    else
                    {
                        tblIdleList = Personnel_AttendanceV2Data.GetPersonelAttendance(m_data, year, month, lueCatalogue_Department.GetIntValue());
                    }
                }
                else
                {
                    tblIdleList = Personnel_AttendanceV2Data.GetPersonelAttendanceByUserKey(m_data, year, month, GblLoginInfo.iDepartmentKey, GblLoginInfo.sysLoginPersionalKey.ToString());
                }

                if (tblIdleList.Rows.Count > 0)
                {
                    gctAttendance.DataSource = tblIdleList;
                    grvAttendance.BestFitColumns();
                }
                else //Nếu không có thì tạo mới danh sách chấm công
                {
                    this.CreateAttendance();
                }

                //Nếu đã khóa
                //Kiểm tra khi nào thi khóa bảng chấm công
                this.CheckForLockAttendanceGrid();

                xtpByDept.PageVisible = true; //Cho hiện tabpage Chấm công theo đơn vị
                xtraTabPage1.PageVisible = false;


                return;  //Hết chấm công chi tiết
            }

            //this.CheckForLockAttendanceGrid();
            #endregion

            #region [Bảng chấm công tổng hợp]
            if (ckeSumary.Checked)
            {

                if (cmbMonth.Text != "" && cmbYear.Text != "")
                {
                    if (year == DateTime.Now.Year && month > DateTime.Now.Month)
                    {
                        MsgConfig.ShowErrorDialog("Không thể tổng hợp, vui lòng kiểm tra lại thời điểm tổng hợp");
                        m_Synthesis.DataSource = null;
                        return;
                    }

                    if (iDptAllowList.Count > 0)
                    {
                        if (lueCatalogue_Department.EditValue == null)
                        {
                            try
                            {
                                m_Synthesis.DataSource = Personnel_AttendanceV2Data.GetAttendance_SynthesisByAppList(m_data, year, month, iDepartmentList);
                            }
                            catch { m_Synthesis.DataSource = null; }
                        }
                        else
                        {

                            try
                            {
                                m_Synthesis.DataSource = Personnel_AttendanceV2Data.GetAttendance_Synthesis(m_data, year, month, lueCatalogue_Department.GetIntValue());
                            }
                            catch { m_Synthesis.DataSource = null; }
                        }
                    }
                    else
                    {
                        try
                        {
                            m_Synthesis.DataSource = Personnel_AttendanceV2Data.GetAttendance_SynthesisByUserKey(m_data, year, month, GblLoginInfo.sysLoginPersionalKey.ToString(), GblLoginInfo.iDepartmentKey);
                        }
                        catch { m_Synthesis.DataSource = null; }
                    }
                }
                else
                {
                    MsgConfig.ShowErrorDialog("Vui lòng chọn đầy đủ thông tin tháng, năm");
                }
                xtraTabPage1.PageVisible = true;
                xtpByDept.PageVisible = false; //Cho ẩn tabpage chấm công theo đơn vị
            }
            gridView2.ExpandAllGroups();
            #endregion
        }
        #endregion

        //In đơn xin nghỉ phép
        private void PrintAbsentForm(Guid currentKey, Guid loginUserKey, string symbol, string day)
        {

            if (string.Compare(symbol.ToUpper(), "P") == 0)
            {
                Personnel_Personnel prs = m_data.m_DCReadOnly.Personnel_Personnels.Where(p => p.Personnel_PersonnelKey == currentKey).FirstOrDefault();
                string position = m_data.m_DCReadOnly.Catalogue_Positions.Where(p => p.Catalogue_PositionKey == prs.Catalogue_PositionKey).FirstOrDefault().Name;
                string days = (day.Length == 1 ? ("0" + day) : day);
                string months = (month.Length == 1 ? ("0" + month) : month);
                string dept = string.Empty;
                if (lueCatalogue_Department.EditValue != null)
                {
                    dept = lueCatalogue_Department.Text;
                }
                new FrmAttendance_RptAbsent(prs.LastName + " " + prs.Name, position, dept, days, month, year).ShowPreview();
            }
        }

        //STT
        private void grvAttendance_CustomDrawRowIndicator(object sender, DevExpress.XtraGrid.Views.Grid.RowIndicatorCustomDrawEventArgs e)
        {
            if (e.Info.IsRowIndicator && e.RowHandle >= 0)
            {
                e.Info.DisplayText = (e.RowHandle + 1).ToString();
            }
        }

        //Nút in
        private void btnPrint_Click(object sender, EventArgs e)
        {
            try
            {
                string dept = string.Empty;
                if (lueCatalogue_Department.GetIntValue() != -1) { dept = lueCatalogue_Department.Text; }
                else
                {
                    var deptItem = m_data.m_DCReadOnly.Catalogue_Departments.Where(p => p.Catalogue_DepartmentKey == GblLoginInfo.iDepartmentKey);
                    dept = deptItem.FirstOrDefault().Name;
                }
                DataTable tblTemp = gctAttendance.DataSource as DataTable;
                if (tblTemp.Rows.Count > 0)
                {
                    new FrmAttendance_RptMonth(this.MakeConclusionTable(tblTemp), this.month, this.year, dept).ShowPreview();
                }
                else
                {
                    MsgConfig.ShowErrorDialog("Bảng chấm công rỗng, không thể in");
                }
            }
            catch (Exception ex) { MsgConfig.ShowErrorDialog("Không có dữ liệu, vui lòng kiểm tra lại. Mã lỗi:\n" + ex.Message); }
        }

        private void btnUnclock_Click(object sender, EventArgs e)
        {
            //Set các quyền cơ bản Edit = "Mở khóa bảng chấm công"

            if (!SysUtils.CheckEditByRule(this.m_Rule))
            {
                return;
            }

            Personnel_AttendanceInfo info = new Personnel_AttendanceInfo(int.Parse(year), int.Parse(month), lueCatalogue_Department.GetIntValue());
            if (info.Properties.Personnel_AttendanceKey != null)
            {
                info.Properties.IsClocked = false;
                info.Save();
                grvAttendance.OptionsBehavior.Editable = true;
                btnUnclock.Enabled = false;
                btnClock.Enabled = true;
            }
        }

        private void bbiAddPrs_ItemClick(object sender, ItemClickEventArgs e)
        {
            try
            {
                new FrmAttendance_SubAddEmployee(this.year, this.month, lueCatalogue_Department.GetIntValue()).ShowDialog();
            }
            catch { }
        }

        //int i = 0;
        private void grvAttendance_CellMerge(object sender, DevExpress.XtraGrid.Views.Grid.CellMergeEventArgs e)
        {
        }

        private void xóaNhânViênNàyKhỏiBảngChấmCôngToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //Phải lưu bảng chấm công rồi thì mới xóa được !!!!!! Nếu chưa lưu gõ kí tự ngẫu nhiên để lưu
            if (!SysUtils.CheckDeleteByRule(this.m_Rule))
            {
                return;
            }

            DialogResult rs = XtraMessageBox.Show("Xóa?", "Xóa", MessageBoxButtons.OKCancel);
            if (rs == DialogResult.OK)
            {
                try
                {
                    string key = grvAttendance.GetFocusedRowCellValue("Personnel_PersonnelKey").ToString();
                    Personnel_AttendanceV2Info att = new Personnel_AttendanceV2Info(int.Parse(year), int.Parse(month), lueCatalogue_Department.GetIntValue());
                    var shifts = m_data.m_DCReadOnly.Catalogue_Shifts;
                    foreach (var shift in shifts)
                    {
                        Personnel_AttendanceDetailV2Info info = new Personnel_AttendanceDetailV2Info(att.Properties.Personnel_AttendanceKey, key, shift.Catalogue_ShiftsKey);
                        info.Delete();
                        info.Save();
                    }
                    Personnel_TotalWorkDayInfo wdInfo = new Personnel_TotalWorkDayInfo(att.Properties.Personnel_AttendanceKey, key);
                    wdInfo.Delete();
                    wdInfo.Save();
                    //Nếu xóa bảng chấm công mà ko còn người nào thì xóa luôn bản chấm công
                    var q = m_data.m_DCReadOnly.Personnel_Attendance_DetailV2s.Where(p => p.Personnel_AttendanceKey == att.Properties.Personnel_AttendanceKey);
                    if (q.Count() == 0)
                    {
                        att.Delete();
                        att.Save();
                    }
                    this.btnView_Click(sender, e);
                }
                catch (Exception ex) { MessageBox.Show("Lỗi. Mã lỗi: \n" + ex.Message); }
            }
        }

        //Lưu bảng chấm công
        private void btnSave_Click(object sender, EventArgs e)
        {
            try
            {
                this.Save_Attendace();
                XtraMessageBox.Show("Lưu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex) { XtraMessageBox.Show("Lỗi. Mã lỗi:\n" + ex.Message, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error); }
        }

        //Chuyển bảng chấm công dạng 3 ca sang report
        public DataTable MakeConclusionTable(DataTable tblAttendance)
        {
            DevExpress.Utils.WaitDialogForm dlg = new DevExpress.Utils.WaitDialogForm(MsgConfig.MSG_WAIT, MsgConfig.MSG_LOADING);
            DataTable tblResult = new DataTable();

            #region [InitTable]
            tblResult.Columns.Clear();
            DataColumn tcl0 = new DataColumn("Personnel_PersonnelKey");
            DataColumn tcl1 = new DataColumn("ID");
            DataColumn tcl2 = new DataColumn("LastName");
            DataColumn tcl3 = new DataColumn("Name");
            DataColumn tcl4 = new DataColumn("Catalogue_DepartmentKey");
            tblResult.Columns.AddRange(new DataColumn[] { tcl0, tcl1, tcl2, tcl3, tcl4 });

            for (int i = 26; i <= 31; i++)
            {
                DataColumn tcl = new DataColumn("D" + i);
                tblResult.Columns.Add(tcl);
            }
            for (int i = 1; i <= 25; i++)
            {
                DataColumn tcl = new DataColumn("D" + i);
                tblResult.Columns.Add(tcl);
            }

            DataColumn tcl13 = new DataColumn("AbsentDay");
            DataColumn tcl14 = new DataColumn("WorkDay");
            DataColumn tcl15 = new DataColumn("ContactWorkDays");
            DataColumn tcl16 = new DataColumn("AllowDay");
            DataColumn tcl17 = new DataColumn("TotalWorkDay");
            //DataColumn tcl18 = new DataColumn("ContactWorkDays");

            tblResult.Columns.AddRange(new DataColumn[] { tcl13, tcl14, tcl15, tcl16, tcl17 });
            tblResult.PrimaryKey = new DataColumn[] { tcl0 };
            #endregion

            Dictionary<string, string> dictAddedKey = new Dictionary<string, string>();

            #region [Tính tổng ngày công/ngày nghỉ theo ngày]
            foreach (DataRow r in tblAttendance.Rows)
            {
                var q = dictAddedKey.Where(p => p.Key == r["Personnel_PersonnelKey"].ToString());
                if (q.Count() == 0) //Nếu nhân viên này chưa có thì chấm và đưa vào
                {
                    DataRow newRow = tblResult.NewRow();
                    newRow["LastName"] = r["LastName"].ToString();
                    newRow["Name"] = r["Name"].ToString();
                    newRow["Personnel_PersonnelKey"] = Guid.Parse(r["Personnel_PersonnelKey"].ToString());
                    newRow["ContactWorkDays"] = r["ContactWorkDays"];

                    newRow["AbsentDay"] = r["TotalAbsentDay"];
                    double wd = double.Parse(newRow["ContactWorkDays"].ToString()) - double.Parse(newRow["AbsentDay"].ToString());
                    newRow["WorkDay"] = wd;

                    foreach (DataColumn cl in tblAttendance.Columns)
                    {
                        string colName = cl.ColumnName;
                        if (colName.StartsWith("D"))
                        {
                            newRow[colName] = r[cl].ToString();
                        }
                    } //End foreach
                    dictAddedKey.Add(r["Personnel_PersonnelKey"].ToString(), r["Personnel_PersonnelKey"].ToString());
                    tblResult.Rows.Add(newRow);
                } //End if


                else             //Nếu có rồi thì cộng dồn ngày công
                {
                    DataRow newRow = tblResult.Rows.Find(Guid.Parse(r["Personnel_PersonnelKey"].ToString()));
                    //if (r["Catalogue_ShiftsKey"].ToString() == "3") continue;
                    foreach (DataColumn cl in tblAttendance.Columns)
                    {
                        string colName = cl.ColumnName;
                        if (colName.StartsWith("D"))
                        {
                            newRow[colName] = newRow[colName] + "." + r[cl].ToString();
                        }
                    }//End foreach
                } //End else
            }//End foreach

            //Duyệt 1 lần nữa để tính ngày lại chính xác hơn
            foreach (DataRow r in tblResult.Rows)
            {
                foreach (DataColumn cl in tblResult.Columns)
                {
                    string colName = cl.ColumnName;
                    if (colName.StartsWith("D"))
                    {
                        var q = m_data.m_DCReadOnly.Catalogue_Idles.Where(p => p.V2 == true);

                        #region [xử lý dư ".." , ".@@" , "@@.", "..@", "@.."]
                        if (r[colName].ToString().Replace(".", "").Trim() == string.Empty)
                        {
                            r[colName] = "";
                        }
                        if (r[colName].ToString().StartsWith(".."))
                        {
                            r[colName] = r[colName].ToString().Substring(2);
                            r[colName] = q.Where(p => p.ID.ToUpper() == r[colName].ToString().ToUpper()
                                                  && p.V2 == true).FirstOrDefault().WorDaysPlus.ToString();
                        }
                        if (r[colName].ToString().EndsWith(".."))
                        {
                            r[colName] = r[colName].ToString().Substring(0, r[colName].ToString().Length - 2);
                            r[colName] = q.Where(p => p.ID.ToUpper() == r[colName].ToString().ToUpper()
                                                   && p.V2 == true).FirstOrDefault().WorDaysPlus.ToString();
                        }
                        if (r[colName].ToString().StartsWith("."))
                        {
                            r[colName] = r[colName].ToString().Substring(1);
                        }
                        if (r[colName].ToString().EndsWith("."))
                        {
                            r[colName] = r[colName].ToString().Substring(0, r[colName].ToString().Length - 1);
                        }
                        #endregion

                        foreach (var item in q)
                        {
                            if (r[colName].ToString().Contains(item.ID + "." + item.ID))
                            {
                                r[colName] = item.ID;
                                break;
                            }
                        }

                        #region [Tính 3 ca]
                        if (r[colName].ToString().Contains("."))
                        {
                            string[] IDs = this.getIDs(r[colName].ToString());

                            double total1 = 0.0;
                            bool flagH = false;
                            foreach (string syb in IDs)
                            {

                                var qs = m_data.m_DCReadOnly.Catalogue_Idles.Where(p => p.ID.ToUpper() == syb.ToUpper()
                                                                                     && p.V2 == true);
                                foreach (var item in qs)
                                {
                                    total1 += double.Parse(item.WorDaysPlus.ToString());
                                }

                                if (syb == "h") { flagH = true; }
                            }

                            if (total1 == 1 && flagH == true) { r[colName] = "0.5h"; }
                            if (total1 == 1 && flagH == false) { r[colName] = "x"; }
                            if (total1 == 0.5) { r[colName] = "0.5"; }
                            if (total1 == 1.5) { r[colName] = "1.5"; }
                        }
                        #endregion

                    }
                }
            }
            #endregion
            dlg.Close();
            return tblResult.SortDataTable("Name");
        }

        #region [Chuyển chấm công sang ngày phép, ngày nghỉ]
        public string[] getIDs(string IDs)
        {
            string[] resutl = new string[3] { string.Empty, string.Empty, string.Empty };

            Dictionary<int, int> dictVal = new Dictionary<int, int>();
            int[] index = new int[3] { -1, -1, -1 };

            int pos = 0, lengh = 0;
            for (int i = 0; i < IDs.Length; i++)
            {
                lengh++;
                if (IDs[i] == '.')
                {
                    dictVal.Add(pos, lengh);
                    index[pos] = i;
                    pos++;
                    lengh = 0;
                }
            }
            if (dictVal.Count == 1)
            {
                resutl[0] = IDs.Substring(0, dictVal[0] - 1);
                resutl[1] = IDs.Substring(index[0] + 1);
            }
            if (dictVal.Count == 2)
            {
                resutl[0] = IDs.Substring(0, dictVal[0] - 1);
                resutl[1] = IDs.Substring(index[0] + 1, dictVal[1] - 1);
                resutl[2] = IDs.Substring(index[1] + 1);
            }
            return resutl;
        }
        #endregion

        private void grvAttendance_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e)
        {
            Rectangle r = e.Bounds;
            if (((e.RowHandle + 1) % 3 == 0 && e.RowHandle >= 2) || (e.Column.FieldName == "NameID" && e.RowHandle > 0))
            {
                e.Graphics.DrawLine(Pens.Blue, r.Left, r.Bottom, r.Right, r.Bottom);
                e.Graphics.DrawLine(Pens.Blue, r.Left, r.Bottom, r.Left - r.Width - 3, r.Bottom);
            }
        }

        private void xucBar1_btnExport_Click(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {

            try
            {
                gridView2.ExpandAllGroups();
                SaveFileDialog sd = new SaveFileDialog();
                sd.Filter = "Excel files (*.xlsx)|*.xlsx";
                sd.ShowDialog();
                if (sd.FileName != string.Empty)
                {
                    gctAttendance_Synthesis.ExportToXlsx(sd.FileName);
                }

            }
            catch (Exception ex) { MsgConfig.ShowErrorDialog("Lỗi. Mã lỗi:\n" + ex.Message); }

        }

        private void copyToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FrmAttendance_SubCoppy frm = new FrmAttendance_SubCoppy(int.Parse(cmbMonth.Text), int.Parse(cmbYear.Text));
            frm.ShowDialog();
            this.CopyBySymbol(frm.iOption, frm.iFrom, frm.iTo, frm.symbol);
           
        }

        private void CopyBySymbol(int iOptions, int fromDate, int toDate, string symbol)
        {
            if (iOptions == -1) { return; }
            if (iOptions == 2)
            {
                WaitDialogForm dlg = new WaitDialogForm(MsgConfig.MSG_WAIT, MsgConfig.MSG_LOADING);
                int from = fromDate;
                int to = toDate;

                foreach (DataRow r in tblIdleList.Rows)
                {
                    var q = dictSymbol.Where(p => p.Value == symbol);
                    if (q.Count() == 0) { MsgConfig.ShowErrorDialog("Ký hiệu chấm công không hợp lệ"); return; }

                    int Month = int.Parse(this.month);
                    int Year = int.Parse(this.year);

                    foreach (DataColumn cl in (gctAttendance.DataSource as DataTable).Columns)
                    {
                        string colName = cl.ColumnName;
                        if (colName.StartsWith("D"))
                        {
                            //Đoạn từ 26...31
                            if (from >= 26 && to >= 26 && to >= from)
                            {
                                int day = int.Parse(colName.Substring(1));
                                if (day >= from && day <= to && int.Parse(r["Catalogue_ShiftsKey"].ToString()) != 3)
                                {
                                    if (this.DayOfWeek(Year, Month, day) != "Sunday")
                                    {
                                        r[colName] = symbol;
                                    }

                                }
                            }
                            //Đoạn từ 1..25
                            else if ((from >= 1 && from <= 25) && (to >= 1 && to <= 25) && to >= from)
                            {
                                int day = int.Parse(colName.Substring(1));
                                if (day >= from && day <= to && int.Parse(r["Catalogue_ShiftsKey"].ToString()) != 3)
                                {
                                    if (this.DayOfWeek(Year, Month, day) != "Sunday")
                                    {
                                        r[colName] = symbol;
                                    }

                                }
                            }
                            //From >25, to từ 1...25
                            else
                            {
                                int day = int.Parse(colName.Substring(1));
                                if ( (day >= from || day <= to) && int.Parse(r["Catalogue_ShiftsKey"].ToString()) != 3)
                                {
                                    if (this.DayOfWeek(Year, Month, day) != "Sunday")
                                    {
                                        r[colName] = symbol;
                                    }

                                }
                            }
                        }
                    }
                }

                //Gán giá trị vào lưới để gọi sự kiện CellValueChanged
                for (int i = 0; i < grvAttendance.RowCount; i++)
                {
                    string val = grvAttendance.GetRowCellValue(i, "D25").ToString();
                    grvAttendance.SetRowCellValue(i, "D25", val);
                }
                dlg.Close();
            }
        }

        public string DayOfWeek(int Year, int Month, int dayNum)
        {
            string dayOfWeek = string.Empty;
            if (dayNum > 25) //tháng trước
            {
                try
                {
                    dayOfWeek = new DateTime(Month - 1 > 0 ? Year : Year - 1, Month - 1 > 0 ? Month - 1 : 12, dayNum).DayOfWeek.ToString();
                }
                catch { }
            }
            else //tháng hiện tại
            {
                try
                {
                    dayOfWeek = new DateTime(Year, Month, dayNum).DayOfWeek.ToString();
                }
                catch { }
            }
            return dayOfWeek;
        }
    }
}